// Dart中的Future和async/await示例
// Future表示一个异步操作的最终完成（或失败）及其结果值

import 'dart:async';

// 基本的Future用法
void basicFutures() {
  print('\n基本的Future用法:');
  print('-------------------');

  // 创建一个延迟完成的Future
  Future<String> fetchUserOrder() {
    // 模拟从服务器获取用户订单
    return Future.delayed(Duration(seconds: 2), () => '咖啡');
  }

  // 使用then()处理Future完成
  fetchUserOrder()
      .then((order) => print('你的订单是: $order'))
      .catchError((error) => print('发生错误: $error'))
      .whenComplete(() => print('订单处理完成'));

  print('等待订单...');
}

// 使用async/await处理Future
Future<void> usingAsyncAwait() async {
  print('\n使用async/await:');
  print('-------------------');

  Future<String> fetchUserOrder() {
    return Future.delayed(Duration(seconds: 2), () => '蛋糕');
  }

  print('等待订单...');
  try {
    // await暂停执行，直到Future完成
    final order = await fetchUserOrder();
    print('你的订单是: $order');
  } catch (error) {
    print('发生错误: $error');
  } finally {
    print('订单处理完成');
  }
}

// Future链式调用
Future<void> chainingFutures() async {
  print('\nFuture链式调用:');
  print('-------------------');

  Future<String> fetchIngredient() {
    return Future.delayed(Duration(seconds: 1), () => '面粉');
  }

  Future<String> fetchAnotherIngredient(String firstIngredient) {
    return Future.delayed(Duration(seconds: 1), () => '$firstIngredient和糖');
  }

  Future<String> bake(String ingredients) {
    return Future.delayed(Duration(seconds: 1), () => '使用$ingredients烤制的饼干');
  }

  // 使用then()链式调用
  fetchIngredient()
      .then((ingredient) => fetchAnotherIngredient(ingredient))
      .then((ingredients) => bake(ingredients))
      .then((product) => print('链式调用结果: $product'));

  // 使用async/await实现相同功能
  final ingredient = await fetchIngredient();
  final ingredients = await fetchAnotherIngredient(ingredient);
  final product = await bake(ingredients);
  print('async/await结果: $product');
}

// 并行执行多个Future
Future<void> parallelFutures() async {
  print('\n并行执行多个Future:');
  print('-------------------');

  Future<String> fetchItem(String item) {
    return Future.delayed(Duration(seconds: 1), () => '获取到: $item');
  }

  // 并行执行多个Future，等待所有完成
  final futures = await Future.wait([
    fetchItem('苹果'),
    fetchItem('香蕉'),
    fetchItem('橙子'),
  ]);

  print('所有项目都已获取:');
  for (var result in futures) {
    print('  $result');
  }
}

// 处理Future中的错误
Future<void> handlingErrors() async {
  print('\n处理Future中的错误:');
  print('-------------------');

  Future<String> fetchData(bool shouldSucceed) {
    return Future.delayed(Duration(seconds: 1), () {
      if (shouldSucceed) {
        return '这是一些数据';
      } else {
        throw Exception('无法获取数据');
      }
    });
  }

  // 使用catchError处理错误
  fetchData(false)
      .then((data) => print('获取的数据: $data'))
      .catchError((error) => print('使用catchError捕获: $error'));

  // 使用try-catch处理错误
  try {
    final data = await fetchData(false);
    print('获取的数据: $data');
  } catch (error) {
    print('使用try-catch捕获: $error');
  }
}

// 超时处理
Future<void> timeoutExample() async {
  print('\n超时处理:');
  print('-------------------');

  Future<String> longRunningOperation() {
    return Future.delayed(Duration(seconds: 3), () => '操作完成');
  }

  try {
    // 设置2秒超时
    final result = await longRunningOperation().timeout(Duration(seconds: 2));
    print('结果: $result');
  } on TimeoutException catch (e) {
    print('操作超时: $e');
  }
}

void main() async {
  print('Dart Future和async/await示例');

  // 运行各种Future示例
  basicFutures();

  // 等待3秒，让basicFutures()完成
  await Future.delayed(Duration(seconds: 3));

  await usingAsyncAwait();
  await chainingFutures();
  await parallelFutures();
  await handlingErrors();
  await timeoutExample();

  print('\n所有示例执行完毕');
}
